<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /*
      回调函数 
      高阶函数
      柯里化函数
      */
      /* 
      高阶函数: 参数是函数或者返回值是函数
        数组一系列带回调的遍历方法 / Promise / then / 定时器
        bind / 闭包

        高阶函数的能力比一般函数的能力要强
      */

      Function.prototype.bind = function (thisObj) {
        console.log('bind')
        return (...args) => {
          this.call(thisObj, ...args)
        }
      }

      function fn(a, b) {
        console.log(this, a, b)
      }
      const obj = {m: 1}
      // bind: 返回一个新函数, 新函数内部会调用原函数, 且this是bind指定的第一个参数
      const fn2 = fn.bind(obj)
      fn2(3, 4)

      function fn1() {
        var a = 2
        function fn2() {
          a++
          console.log(a)
        }
        return fn2
      }

      let fn3 = fn1()
      fn3() // 3
      fn3() // 4
      fn3 = null

    </script>
  </body>
</html>
